package org.alps.pattern.singleton.lazy;

/**
 * @date 2021-04-30
 * @author zkw
 */
public class LazyInnerClassSingleton {
    /**
     * 虽然构造方法私有，但是，通过反射还是可以获取到
     */
    private LazyInnerClassSingleton() {
        //防止通过反射的方式进行攻击
        if (LazyHolder.SINGLETON != null) {
            throw new RuntimeException("不允许构建多个实例");
        }
    }

    /**
     * 懒汉式单例
     * LazyHolder里面的逻辑需要等到外部方法getInstance()调用时才执行
     * 巧妙的利用了内部类的特性
     * JVM底层执行逻辑，避免了线程安全问题
     * @return
     */
    public static final LazyInnerClassSingleton getInstance() {
        return LazyHolder.SINGLETON;
    }

    /**
     * 静态内部类
     * 没有用到synchronized关键字
     * 性能最优的一种单例写法
     */
    private static class LazyHolder {
        private static final LazyInnerClassSingleton SINGLETON = new LazyInnerClassSingleton();
    }
}
